﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Common.DataAccess;
using CBE.Model;

namespace CBE.DataAccess
{
    public class AdministrarTurnosDataAccess : GenericEntityManagerDataAccess<Turnos, AdministrarTurnosCriteria, AdministrarTurnosView, CBEEntities>
    {

        protected override Turnos ReadEntity(Guid id)
        {
            return ObjectContext.Turnos.
                Include("Clientes").
                Include("Empleados").
                Include("Servicios").
                Where(turno => turno.ID_Turno == id).
                FirstOrDefault();
        }

        public override List<AdministrarTurnosView> Read(AdministrarTurnosCriteria criteria)
        {
            return ObjectContext.Turnos.
                Where(turno => (String.IsNullOrEmpty(criteria.NombreApellido) || turno.Clientes.Apellido.Contains(criteria.NombreApellido) || turno.Clientes.Nombre.Contains(criteria.NombreApellido)) &&
                               (!criteria.Fecha.HasValue || (criteria.Fecha.Value == turno.Fecha)) &&
                               (criteria.IDServicio == Guid.Empty || criteria.IDServicio == turno.Servicios.ID_Servicio) &&
                               (!criteria.Numero.HasValue || criteria.Numero.Value == turno.Numero) &&
                               turno.Activo
                               ).
                Select(turno => new AdministrarTurnosView
                {
                    ID = turno.ID_Turno,
                    Fecha = turno.Fecha,
                    NombreApellido = turno.Clientes.Nombre + " " + turno.Clientes.Apellido,
                    Numero = turno.Numero,
                    TipoServicio = turno.Servicios.Descripcion,
                    Hora = turno.Hora
                }).OrderBy(t => t.Numero).ToList();
        }

        public List<Turnos> ReadEntitiesByCritera(AdministrarTurnosCriteria criteria)
        {
            return ObjectContext.
                Turnos.
                Include("Clientes").
                Include("Empleados").
                Include("Servicios").
                Where(turno => criteria.Fecha.Value == turno.Fecha && turno.Activo).
                OrderBy(t => t.Numero).ToList();
        }

        public void Cancelar(Common.Model.ViewEntity viewEntity)
        {
            var turno = this.Read(viewEntity.ID);

            turno.Activo = false;

            this.Save(turno);
        }

        public void CancelarTurnosAnteriores()
        {
            var turnos = ObjectContext.Turnos.
                 Where(turno => turno.Fecha < DateTime.Now &&
                                turno.Activo && !turno.Finalizado);

            foreach (var item in turnos)
            {
                item.Activo = false;
            }
            ObjectContext.SaveChanges();
        }

        public override List<Turnos> ReadEntities()
        {
            var hoy = DateTime.Now.Date;

            return ObjectContext.
                    Turnos.
                    Include("Clientes").
                    Include("Empleados").
                    Include("Servicios").
                    Where(turno => hoy == turno.Fecha && turno.Activo && !turno.Finalizado).
                    OrderBy(t => t.Numero).ToList();
        }

        public List<Turnos> ReadByEmpleado(Turnos turno)
        {
            var queryPorEmpleado = ObjectContext.Turnos.
                Include("Servicios").
                Where(t => t.ID_Turno != turno.ID_Turno &&
                      t.Empleados.ID_Empleado == turno.Empleados.ID_Empleado && t.Fecha == turno.Fecha &&
                      turno.Activo);
            return queryPorEmpleado.ToList();
        }
    }
}
